package DieSiedler;
/*
 * Bauplatz.java
 *
 * Created on 27. April 2007, 07:54
 *
 * To change this template, choose Tools | Template Manager
 * and open the template in the editor.
 */


import static DieSiedler.Konstanten.*;
import javax.swing.*;
import java.io.*;

import javax.imageio.*;

import java.awt.*;


/**
 * Ein Bauplatz ist eine Stelle auf dem Spielfeld auf der eine Siedlung oder Stadt gebaut werden kann.
 * @author Michi
 */
public class Bauplatz extends JButton{
    private static boolean hasMoreInstance = false;
    private boolean zustandAktuell = true;
    public enum Zustand {leer,siedlung,stadt};
    private Color ownerColor;
    private Zustand zustand;
    private static Image[] bild;             //       X ->|       | Y
    private int owner;                       //       X2 ___ X1   v
    private int x0, x1, x2, x3, x4, x5;      //         /   \ X0  -
    private int y0, y1, y2, y3, y4, y5;      //      X3 \   /
                                             //          --- X5
                                             //       X4
    private int logischX, logischY;
    private Baumodus bauModus;
    private int aktuellerSpieler;
    
    /**
     * Creates a new instance of Bauplatz
     */
    public Bauplatz(Spielfeld spielfeld) {
        zustandAktuell = false;
        zustand = Zustand.leer;
        this.addActionListener(spielfeld);
        if(!hasMoreInstance){
            hasMoreInstance = true;
            try{
                bild = new Image[5];
                try {
					bild[0] = ImageIO.read(getClass().getResourceAsStream("/DieSiedler/Bilder/Stadt/siedlung.gif"));
					bild[1] = ImageIO.read(getClass().getResourceAsStream("/DieSiedler/Bilder/Stadt/gedrueckt.gif"));
	                bild[2] = ImageIO.read(getClass().getResourceAsStream("/DieSiedler/Bilder/Stadt/stadt.gif"));
	                bild[3] = ImageIO.read(getClass().getResourceAsStream("/DieSiedler/Bilder/Stadt/siedlung-preview.gif"));
	                bild[4] = ImageIO.read(getClass().getResourceAsStream("/DieSiedler/Bilder/Stadt/stadt-preview.gif"));
                } catch (IOException e) {
					// TODO Auto-generated catch block
					e.printStackTrace();
				}
                
            }
            catch(NullPointerException e){
            }
        }
        berechneEckpunkte();
        this.setVisible(true);
        this.setBounds(0,0,2*kantenlaenge+1,y4-y1+1);
        //this.setToolTipText("Dies ist eine Bauplatz");
        this.setBorderPainted(false);
        this.setCursor(new Cursor(Cursor.HAND_CURSOR));
        this.addMouseListener(spielfeld);
        
        this.bauModus = Baumodus.Inaktiv;
        this.aktuellerSpieler = -1;
    }
    
    public Zustand getZustand(){
        return zustand;
    }
    
    public void setBaumodus(Baumodus bauModus, int aktuellerSpieler){
    	this.bauModus = bauModus;
    	this.aktuellerSpieler = aktuellerSpieler;
    }
    
    public void setWerte(BauElement bauelement, Color ownerColor){
        this.logischX = bauelement.getX();
        this.logischY = bauelement.getY();
        this.owner = bauelement.getBesitzer();
        this.ownerColor = ownerColor;
        if(bauelement.getZustand()==Fortschritt.Stadt){
            this.zustand = Zustand.stadt;
        }
        else if(bauelement.getZustand()==Fortschritt.Siedlung){
            this.zustand = Zustand.siedlung;
        }
        else{
            this.zustand = Zustand.leer;
        }
        //this.zustand = zustand.stadt;
        int x,y;
        x = Konstanten.x0+((bauelement.getX()*b))/4;
        if(bauelement.getY()%4==2){
            y = Konstanten.y0+(((bauelement.getY()*h)*6)/8)/4-Konstanten.kantenlaenge/2-4;
        }
        else{
            y = Konstanten.y0+(((bauelement.getY()*h)*6)/8)/4;
        }
        
        setLocation(x,y);
    }
    
    public Dimension getKoordinaten(){
        return new Dimension(logischX, logischY);
    }
    
    public void setLocation(int x, int y){
        setBounds(x-kantenlaenge, (int)(y-1.73f*kantenlaenge/2.0f), 2*kantenlaenge+1, y4-y1+1);
    }
    
    public boolean contains(int xp, int yp){
        if((yp>=y1) && (y4>=yp)  && 
           (yp >= y3 + ((xp-x3)*(y2-y3)/(x2-x3))) &&    //Geradengleichungen
           (yp <= y3 + ((xp-x3)*(y4-y3)/(x4-x3))) &&
           (yp >= y0 + ((xp-x0)*(y1-y0)/(x1-x0))) &&
           (yp <= y0 + ((xp-x0)*(y5-y0)/(x5-x0)))){
            return true;
        }
        return false;
    }
    public boolean contains(Point p){
        return this.contains((int)(p.getX()), (int)(p.getY()));
    }
    
    public void paint(Graphics g){
    	
    	boolean bebaubar = (owner == aktuellerSpieler || owner < 0) && 
							bauModus != Baumodus.Inaktiv &&
							( zustand.equals(Zustand.leer) || (zustand.equals(Zustand.siedlung) && 
							(bauModus == Baumodus.Normal || bauModus == Baumodus.NormalVorschau )) );
    	
    	
    	if(true){
    		if(zustand.equals(Zustand.siedlung)){
                g.drawImage(bild[0], 0, 0, bild[0].getWidth(null), bild[0].getHeight(null), null);  //siedlung
                drawBorder(g, ownerColor);
            }
            if(zustand.equals(Zustand.stadt)){
                g.drawImage(bild[2], 0, 0, bild[2].getWidth(null), bild[2].getHeight(null), null);  //stadt
                drawBorder(g, ownerColor);
            }
    		
    	}
    	if(bauModus == Baumodus.InitialisierungVorschau){
    		if(zustand.equals(Zustand.leer)){    			
                g.drawImage(bild[3], 0, 0, bild[3].getWidth(null), bild[3].getHeight(null), null);
    		}
    	}
    	if(bauModus == Baumodus.Initialisierung || bauModus == Baumodus.InitialisierungVorschau){
    		if(model.isRollover() && zustand.equals(Zustand.leer)){
    			g.drawImage(bild[0], 0, 0, bild[0].getWidth(null), bild[0].getHeight(null), null);
    			drawBorder(g, new Color(212,208,200));
    		}
    		if(model.isPressed()){
    			g.drawImage(bild[1], 0, 0, bild[1].getWidth(null), bild[1].getHeight(null), null);
    			drawBorder(g, Color.RED);
    		}
    	}
    	if(bauModus == Baumodus.NormalVorschau){
    		if(zustand.equals(Zustand.leer)){
    			g.drawImage(bild[3], 0, 0, bild[3].getWidth(null), bild[3].getHeight(null), null);
    		}else if(zustand.equals(Zustand.siedlung)){
    			g.drawImage(bild[4], 0, 0, bild[4].getWidth(null), bild[4].getHeight(null), null);
    			drawBorder(g, ownerColor);
    		}
    	}
    	if(bauModus == Baumodus.Normal || bauModus == Baumodus.NormalVorschau){
    		if(model.isRollover() && zustand.equals(Zustand.leer)){
    			g.drawImage(bild[0], 0, 0, bild[0].getWidth(null), bild[0].getHeight(null), null);
				drawBorder(g, new Color(212,208,200));				
    		}else if(model.isRollover() && zustand.equals(Zustand.siedlung)){
    			g.drawImage(bild[2], 0, 0, bild[2].getWidth(null), bild[2].getHeight(null), null);
				drawBorder(g, new Color(212,208,200));
    		}
    		if(model.isPressed()){
    			g.drawImage(bild[1], 0, 0, bild[1].getWidth(null), bild[1].getHeight(null), null);
    			drawBorder(g, Color.RED);
    		}
    	}
    	
    }
    
    private void drawBorder(Graphics g, Color c){
    	g.setColor(c);
    	
    	GraphicHelper.drawFatLine(g, x0, y0, x1, y1, 2);
        GraphicHelper.drawFatLine(g, x1, y1, x2, y2, 2);
        GraphicHelper.drawFatLine(g, x2, y2, x3, y3, 2);
        GraphicHelper.drawFatLine(g, x3, y3, x4, y4, 2);
        GraphicHelper.drawFatLine(g, x4, y4, x5, y5, 2);
        GraphicHelper.drawFatLine(g, x5, y5, x0, y0, 2);
    }
    
    public void setzeSiedlung(){
        zustand = Zustand.siedlung;
    }
    
    public void setzeStadt(){
        zustand = Zustand.stadt;
    }

    public void berechneEckpunkte(){
        x3 = 0;
        y1 = y2 = 0;
        x0 = 2*kantenlaenge;
        y0 = y3 = (int)(kantenlaenge*1.73/2.0f);
        x1 = x5 = 3*kantenlaenge/2;
        x2 = x4 = kantenlaenge/2;
        y4 = y5 = (int)(kantenlaenge*1.732f);
    }
}
